BLOG main image
전체 (276)
[Computer] (42)
[Programming] (62)
[DBMS] (26)
[Operating System] (21)
[Study English] (8)
[For money] (28)
[Interest] (89)
«   2009/11   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
77890 Visitors up to today!
Today 82 hit, Yesterday 46 hit
'[Programming]/Visual C++ API/MFC'에 해당되는 글 36건
[폭주기관차, 2008/03/12 15:18, [Programming]/Visual C++ API/MFC]
MFC에서 List Control(리스트 컨트롤)의 특정 위치를 선택하는 함수를 구현해보았다.

void SetLlistCtrlSelected(CListCtrl *pCtrl, int uid)
{
    pCtrl->SetItemState( uid, LVIS_SELECTED, LVIS_SELECTED );    // 회색 됨
    pCtrl->EnsureVisible( uid, FALSE );                                         // 스크롤
    pCtrl->SetFocus();                                                                 // 파랗게 만들기
}

매개변수 :
   pCtrl은 List Control의 포인터.
   uid는 선택을 할 목록의 자리이다. 즉, 몇 번째 자리를 선택할지 여부이다.

설명 :
   SetIteamState란 함수로 uid번째의 아이템을 선택하도록 한다.
   이 함수만 수행하면 아마 회색(포커스가 없는) 상태가 된다. 그래서
   SetFocus란 함수를 이용하여 파란색(윈도우 설정마다 다르겠지만, 포커가 있는) 상태로
   만든다.
   그 중간의 EnsureVisble은 선택하려는 컬럼이 스크롤 밑에 있을 경우 그 쪽으로 이동시켜주는
   역할을 한다.

   다이알로그 창이 뜰 때 초기 선택할 값으로 이용할때 사용하면 좋다.

참고 : 메모장_MFC의 글

Trackback Address :: http://kongmks.cafe24.com/trackback/282
Name
Password
Homepage
Secret
[폭주기관차, 2008/01/16 13:50, [Programming]/Visual C++ API/MFC]
Windows의 창을 조절하는 기능 중에서 최소한 어느정도 이하로는,
초대한 어느정도까지만 확대를 할 수 있도록 하고 싶을때 아래와 같은 방법을
사용하면 된다.

우선 OnGetMinMaxInfo이 함수를 오버라이딩 해야한다.
윈도우 위자드에서 CMainFrame에서 오버라이딩 하면 된다.

단, 다이얼로그에서는 ClassWizard에서 아무리 찾아봐도 WM_GETMINMAXINFO라는
메세지를 찾을 수 없을 것이다.

그 이유는 메세지 필터가 다이얼로그로 되어있기 때문이다.

이는 ClassWizard에서 ClassInfo를 선택해서, Advanced options에 있는
메세지필터를 window로 설정 하고 찾아보면 된다.

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR *lpMMI)
{
    // TODO: Add your message handler code here and/or call default
    LPMINMAXINFO lpminmax = (LPMINMAXINFO)lpMMI;

    //여기서 최소값을 정해주면 그 크기 이하로 줄지 않는다.
    lpminmax->ptMinTrackSize.x = 300;
    lpminmax->ptMinTrackSize.y = 300;
    //여기서 최대값을 정해주면 그 크기 이상으로 커지지 않는다.
    lpminmax->ptMaxTrackSize.x = 500;
    lpminmax->ptMaxTrackSize.y = 500;

    CDialog::OnGetMinMaxInfo(lpMMI); 
}


출처 : jytkm2님의 블로그
       호수니님의 블로그

Trackback Address :: http://kongmks.cafe24.com/trackback/277
Name
Password
Homepage
Secret
[폭주기관차, 2008/01/11 17:15, [Programming]/Visual C++ API/MFC]
함수에 가변인수를 주는 예제를 하나 작성해보았다.


#include <stdio.h>
#include <stdarg.h>         // va_ 매크로를 사용하기 위한 헤더

int Test( const char *args, ... )
{
    va_list ap;             // 변수 선언
   
    va_start( ap, args );   // args에 들어온 자료의 처음을 ap란 변수에 넣는다.
   
    while( args != 0 )
    {
        printf("%s\n", args);
                            // const char *형의 다음 자료를 하나 가져온다.
        args = va_arg( ap, const char * );
    }
   
    va_end( ap );           // args 를 종료한다.
   
    return 0;
}

int main( void )
{
    Test( "Test1", "Test2", "Test3", "Test4" );
   
    return 0;
}


va_list : 데이터 타입으로 사용자가 입력한 값이 저장되는 공간입니다.  

va_start(va_list argptr, arg_data_type) : 2개의 인자를 받는 매크로입니다.

va_arg(va_list argptr, T) : 다음 인자가 있을 경우 그 곳으로 이동하는 매크로입니다.

va_end(va_list argptr) : 가변 인자 처리 끝났음을 알리는 매크로입니다.


출처 : 가변인수의 예제
         va_start 함수의 설명

Trackback Address :: http://kongmks.cafe24.com/trackback/274
Name
Password
Homepage
Secret
[폭주기관차, 2008/01/10 00:40, [Programming]/Visual C++ API/MFC]
BHO 예제를 홈페이지에 쓴지 어언 1년이 다되갑니다~

BHO 간단한 예제 만들기 - 1
BHO 간단한 예제 만들기 - 2

제가 작성한 이 글을 보고 저에게 질문을 주신분이 계셔서
저 스스로도 예제글을 보면서 그대로 따라 해봤는데 몇가지 안되는 점이 발견되어
이 곳에서 추가로 설명드리도록 하겠습니다^^

우선 컴파일을 할때 함수 선언에러가 발생할 경우
StdAfx.h파일에 아래의 헤더 파일을 포함해주시면 되겠습니다.

#include <exdisp.h>
#include <exdispid.h>

사용자 삽입 이미지

에러나면 당황말고 이 두 헤더를 삽입하자


그리고 Build 설정에 따라 익스플로워에 적용이 안되는 경우가 있는데
Build방식Win32Debug 혹은 Win32 Release MinSize 중에 하나로 하셔야 합니다.
Unicode 방식은 사실 제가 테스트를 못해봤습니다^^;;;

사용자 삽입 이미지

Win32 Release MinDependency로 하면 적용이 안된다;;;



안정우님께서 보내주신 문의 메일덕분에 오류를 수정하게 되었네요 감사합니다^^
꼭 좋은 프로그램 만드시길 바랍니다^^

추가로 실행 제대로 되는 예제 파일도 링크 해두겠습니다.
이 파일 링크는 무단으로 링크걸지 말아주세요..
돈 내고 쓰는 계정인데 하루 트래픽 제한이 있답니다..^^;;;
그냥 파일을 받으신 다음에 따로 링크해주세요..^^;;;;

Tester.zip

BHO 예제 파일



Trackback Address :: http://kongmks.cafe24.com/trackback/273
lent | 2008/06/15 08:34 | PERMALINK | EDIT/DEL | REPLY
아... 정말 감사합니다. 다른 책에서 bho보고 따라했는데 안되서 몇일을 고뇌하던중 이걸 발견했네요. release minsize로 하면 되는군요 ㅡㅡ;;;
BlogIcon 폭주기관차 | 2008/06/18 15:29 | PERMALINK | EDIT/DEL
도움이 되셨다니 다행이네요^^

좋은 프로그램 많이 만들어주세요~ ㅋㅋ
pcqud | 2009/03/24 09:43 | PERMALINK | EDIT/DEL | REPLY
여기 예제를 다운받아서 실행해보았습니다...근데...컴퓨터를 꼈다 켜도 동작을 계속하는군요....작업관리자에서 이 프로세서도 안보이고 이넘 어떻게 그만 동작하게 하는지 알려 주세요...ㅜㅜ;;
그리고 여기 기본적인 윈도우의 핸들외에 IE에서 보여지고 있는 페이지의 컴포넌트(즉, 입력란, Text박스나 select박스)의 핸들은 못구하는건가요? 구해 낼수 있다면 약간의 코멘트 부탁드립니다...
계속 들어 와 보겠지만...시간이 괞찬으시면 메일로 날려 주셔도 감사 할것 같습니다.
메일주소는 pcqud@hotmail.com입니다. 수고하십시오...좋은 정보 감사합니다.
BlogIcon 폭주기관차 | 2009/04/02 18:12 | PERMALINK | EDIT/DEL
아 해제 하는 방법은 [시작]-[실행] 에서 이렇게 입력하시면 되구요
regsvr32 /u Test.dll
자세한건 'BHO 간단한 예제 만들기 - 2' 란 글 맨 밑에 나와있어요 ㅋ

음 그리고 보여지고 있는 페이지의 텍스트 박스와 셀렉트 박스의 핸들은 아마 못 가져오구요.
재가 스파이로 핸들 얻어볼려고 했는데 안되더라구요. 대신 m_spWebBrowser2->document 이용해서
HTML 파서 해서 텍스트 박스와 셀렉트 박스를 컨트롤 할 수 있는걸로 알고 있어요^^
저도 이거 BHO실행까지만 확인하고 그 이상 진도를 안나가서리
제가 알고 있는건 여기까지네요..^^;;

답변 메일로도 보내드렸어요^^
Name
Password
Homepage
Secret
[폭주기관차, 2007/12/20 22:52, [Programming]/Visual C++ API/MFC]
예외처리는 Java에서 처음 개념을 봤다.

VB에서의 ON ERROR GOTO ~ 처럼 에러가 나면 자동으로
그 분기로 점프하는건줄 알았는데 그거랑은 약간
달른 것이었다.

하지만 조금만 생각해보니 ON ERROR GOTO도 구현할 수 있을꺼
같았고 오히려 ON ERROR GOTO보다 더 유용할 뜻 보인다.
(이전까지는 예외 처리가(try ~ catch가) 왜 있는지 몰랐다.)

우선 내가 그동안은 try ~ catch를 등한시 여기다가 갑자기 관심을 갖게 된 것은
필요한 곳을 찾았기 때문이다.

그동안 코딩을 하면서 메모리 누수가 발생해도 어쩌다가 발생한거니
그리 크게 생각 안하고 대충 프로그램 다시 실행하여서 오류 안나는 동작만
하곤 했다.
하지만 try ~ catch를 다시 곰곰히 보니 어떻게 써야 할지 알았다.

char *pMem = (char *)malloc( 40 * sizeof( char ) );

if( pMem == NULL )
    return FALSE;
   
while( 1 )
{
  이런 저런 수행 문;
   
  if( 에러 발생? )
  {
    if( pMem != NULL )
    {
      free( pMem );
      pMem = NULL;
      return FALSE;
    }
  }
}

if( pMem != NULL )
{
  free( pMem );
  pMem = NULL;
  return TRUE;
}

여기서 처럼 난 항상 if문으로 에러 났을 경우 상황을 대처하곤 했다.
그래도 별 문제는 없었다.

하지만 오늘 발생하고야 말았다. 그것은 if문으로 에러 처리를 할 경우
코드가 너무 방대해지고, 같은 코드를 계속 넣어야 한다는 것이다.

    if( pMem != NULL )
    {
      free( pMem );
      pMem = NULL;
      return FALSE;
    }


프로그램 수행중 에러가 나고 함수에서 빠져 나갈때 잡았던 메모리를 풀어줘야 한다.
그런데 이 구문을 수행하지 않고 리턴을 하게 된다면, 처음에야 오류가 나지 않지만
나중에 가서 알 수 없게 오류가 발생하게 된다.

물론 코딩할때 신중하게 저 코드를 다 써준다면 괜찮지만, 문제는 귀차니즘과 유지보수에
있다.
저런 코드를 매번 삽입하는 번거로움은 둘째 치고, 만약 메모리 변수를 하나 더 선언하게
된다면?

char *pTmp = (char *)malloc( 10 * sizeof( char ) );


이 변수를 추가 한다면 return FALSE, return TRUE; 구문 전에 free(pTmp) 라는 구문을
더 추가 해줘야한다. 한 줄 뿐이겠지만, 나중에 코드가 복잡해진다면 일일이 찾아
넣기란 매우 번거롭고 헷갈릴 것이다.

이를 try ~ catch문으로 쉽게 해결 할 수 있게 되었다.


< try ~ catch문의 간단한 이론 부분 보기 > - 클릭



중요한것은 try, catch, throw, finally 43가지가 있다.

우선 위의 예제부터 try ~ catch로 바꾸어 보자

char *pMem = (char *)malloc( 40 * sizeof( char ) );
BOOL  bResult = TRUE;

try
{
  if( pMem == NULL )
      throw "메모리할당 에러";
     
  while( 1 )
  {
    이런 저런 수행 문;
     
    if( 에러 발생? )
    {
      throw "기타 에러 발생";
    }
  }
}
catch( char *pE )
{
  printf( "에러 발생\r\n   %s", pE );
 
  bResult = FALSE;
}
 
finally
{

  if( pMem != NULL )
  {
    free( pMem );
    pMem = NULL;
  }
 
}

return bResult;

이렇게 변할 것이다.
길이 상으론 오히려 더 복잡해 보인다.
하지만 프로젝트가 커질 수록 오히려 이런 방식이 유지보수하고, 오류 처리에 더 간단할 것이다.

그리고 try ~ catch에 관한 또 다른 예제문도 밑에 있다.
그냥 지나치기엔 안깝고도 자세한 설명이기에 그대로 긁어옴
(출처는 맨 밑에 표기 해뒀습니다)

<좀더 자세한 예제 보기>



출처 : kv20님의 글
(수정일 : 2007년 12월 27일)
Trackback Address :: http://kongmks.cafe24.com/trackback/271
Name
Password
Homepage
Secret
[폭주기관차, 2007/12/05 13:22, [Programming]/Visual C++ API/MFC]
한가지 이름의 함수에 여러가지 동작을 수행하게 할 수 있다.

아래와 같은 클래스가 있다고 보자

class class_A {
public:
    int (*test)(int a)
};


A라는 클래스안에 test란 포인터형 함수가 있다.

지금까지 선언하던 함수랑은 살짝 다르다...

다음과 같은 경우를 보자.

int *test(int a);


이 함수의 세부 사항을 보면

함수이름 : test
매개변수 : int a
반환형식 : int *


이런 뜻이 된다. 그렇다면 아까와 같이 괄호를 치면 어떤 의미가 될 것인가.

int (*test)(int a);

함수이름 : *test
매개변수 : int a
반환형식 : int

그렇다 함수앞에 *(포인트)가 붙은 것이다.

그렇다면 이런 것을 어떻게 사용할까?

아래의 예제를 보자.


int print_a( int a );
{
    printf("a = %d\r\n", a);
   
    return 0;
}

int print_b( int b );
{
    printf("b = %d\r\n", b);
   
    return 0;
}

int (*test)(int a);

int main(void)
{
    test = &print_a;                // 포인터형 test함수에 print_a함수의 주소를 넣었다.
   
    test(1);                          // 포인터형 test함수를 호출했다.
                                        // test 함수는 print_a의 함수 주소를 가지고 있으므로
                                        // print_a함수를 수행한다.

    test = &print_b;

    test(2);

    return 0;
}


출력결과는
a = 1
b = 2


어디에서 응용이 가능한가...?

클래스를 만들때 어떤 동작은 다른 개발자에게 넘겨주고 싶을 때가 있다.
이런 경우는 파생클래스를 만들어서 오버라이딩을 할 수도 있지만
함수 하나만 다른 개발자가 원하는 코드로 사용하게 하고 싶을 경우가 있다.


설명하기 힘드므로 아래와 같은 예를 보자

void 휴식( int)


이런 함수가 있다.

휴식은 클래스를 만들때 정하지 않고 다른 프로그래머가 내 클래스 코드를 사용할때
따로 지정하여 사용하게 하고 싶다면 아래와 같이 선언을 한다.

class 일상{
public:
    void (*휴식)(int);
};


이렇게 클래스를 선언해두면 다른 개발자가 '일상'이라는 클래스를 사용할때 굳이 파생클래스를 이용하지
않더라도 사용할 수가 있다.

void 내휴식(int)
{
    자동차구매();
}

void main(void)
{
    일상 = 폭주기관차;
   
    폭주기관차.휴식 = &내휴식;
   
    폭주기관차.휴식(200);   
}

Trackback Address :: http://kongmks.cafe24.com/trackback/269
Name
Password
Homepage
Secret
[폭주기관차, 2007/11/07 17:41, [Programming]/Visual C++ API/MFC]
아래와 같은 코드를 View클래스의 OnCreate 함수에 아래와 같은 글꼴 변수 함수를 수행하도록 한다.

void ChangeFont(CString strFont, int iFontSize)
{
    CHARFORMAT2    cf;
    CRichEditCtrl &ctrlRich = GetRichEditCtrl();

    cf.cbSize          = sizeof(CHARFORMAT2);
    cf.dwMask          = //  CFM_CHARSET
                           CFM_FACE
                         | CFM_SIZE
                         | CFM_OFFSET
                         | CFM_COLOR
                         | CFM_PROTECTED
                         ;
    cf.dwEffects       = CFE_PROTECTED;
   
    // 데스크탑 모니터와 노트북 모니터의 픽셀 크기를 맞추기 위함
    cf.yHeight         = MulDiv( iFontSize,GetDeviceCaps(::GetDC(HWND_DESKTOP),LOGPIXELSY),72);
    cf.yHeight        *= (1440 / GetDeviceCaps(::GetDC(HWND_DESKTOP),LOGPIXELSY));

    cf.wWeight         = FW_NORMAL;
    cf.yOffset         = 0;
    cf.crTextColor     = RGB(255, 0, 0);
//    cf.bCharSet        = JOHAB_CHARSET;                       5시간 헤매게 한 코드
    cf.bPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
   
    strcpy( cf.szFaceName, strFont );   
       
    // 기본 폰트 변경
    ctrlRich.SetDefaultCharFormat  ( cf );
}


아마 이렇게 하면 한글은 제대로 나오는데 영문이 다른 글꼴(Arial), 혹은 영어/한글 모두 다른 글꼴로
나올 수도 있다.

그 이유는 RichEdit 2.0 이상부터는 자동으로 폰트를 변경해주는 옵션이 있기 때문이다.

아래와 같은 코드를 OnCreate맨위에 작성해주면 된다.

//////////////////////////////////////////////////////////////////////////
// 자동으로 영문 폰트 변경 방지
 ctrlRich.SendMessage( EM_SETLANGOPTIONS
                     , 0
                     , (LPARAM)(ctrlRich.SendMessage( EM_GETLANGOPTIONS, 0, 0 ) & ~IMF_AUTOFONT) );


이게 왜 디폴트로 설정되어있는지 -_-
아무튼 5시간 넘은 삽질 끝에 겨우 완성^^

출처 : 데브피아 답변

Trackback Address :: http://kongmks.cafe24.com/trackback/265
ccoder | 2009/03/09 22:23 | PERMALINK | EDIT/DEL | REPLY
더블로 감사합니다
BlogIcon 폭주기관차 | 2009/04/02 18:13 | PERMALINK | EDIT/DEL
도움 되셨길 바래요~^^
dokde | 2009/06/01 02:07 | PERMALINK | EDIT/DEL | REPLY
와 정말 감사합니다.
이것때문에 밤잠설치고 있었는데
한방에 해결햇네요
BlogIcon 폭주기관차 | 2009/09/14 16:18 | PERMALINK | EDIT/DEL
아 잘 해결 되었다니 다행이네요^^
Name
Password
Homepage
Secret
*1 *2 *3 *4 *5 ... *6